.TITLE XWDRV .IDENT /02/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 02 ; ; SCOTT G. DAVIS 21-JUL-76 ; ; DUE ALMOST ENTIRELY TO XUDRV ; ; MODIFIED BY: ; ; R. E. CALDWELL 26-JUL-79 ; ; RC003 -- REMOVE UNNEEDED CONDITIONALS FOR M-PLUS ; AND USE DDT$ AND GTPKT$ MACROS. ; ; DUP11 SYNCHRONOUS COMMUNICATIONS DRIVER ; ; MACRO LIBRARY CALLS ; .MCALL PKTDF$,HWDDF$ PKTDF$ ;DEFINE I/O PACKET OFFSETS HWDDF$ ;DEFINE HARDWARE REGISTERS .MCALL UCBDF$,CUCDF$ UCBDF$ ; DEFINE UCB OFFSETS CUCDF$ ;COMMUNICATIONS UCB LABELS ; ; EQUATED SYMBOLS ; ; ; RXCSR BIT ASSIGNMENTS ; DTSTCH= 100000 ;DATA SET CHANGE RING= 40000 ;RING LINE ASSERTED CTS= 20000 ;CLEAR TO SEND CRRIER= 10000 ;CARRIER STATE RECACT= 4000 ;RECEIVER ACTIVE DSRDY= 1000 ;DATA SET READY STRSYN= 400 ;STRIP SYNC RXDONE= 200 ;RECEIVER DONE RCVENB= 100 ;RECEIVER INTERRUPT ENABLE DSINTE= 40 ;DATA SET CHANGE INTERRUPT ENABLE SCHSYN= 20 ;SEARCH SYNC MODE BIT RTS= 4 ;REQUEST TO SEND TRMRDY= 2 ;DATA TERMINAL READY ; ; RXDBUF BIT ASSIGNMENTS ; RXERR= 100000 ;RECEIVER ERROR "OR" BIT OVRNER= 40000 ;RECEIVER OVERRUN ERROR IF SET ; ; PARCSR INITIALIZATION VALUES ; DECMOD= 100000 ;SET DDCMP/BISYNCH MODE CRCINH=1000 ;INHIBIT CRC CALCULATION INITMD=DECMOD!CRCINH ;PARAMETER INITIALIZATION BITS ; TSOM=400 ;TRANSFER - START OF MESSAGE ; ; ; TXCSR BIT ASSIGNMENTS ; DNAINT= 100000 ;SET ON DATA NOT AVAILABLE INTERRUPT MSTRST= 400 ;MASTER DEVICE RESET TXDONE= 200 ;TRANSMITTER DONE BIT TXINTE= 100 ;TRANSMITTER INTERRUPT ENABLE BIT DNAEN= 40 ;ENABLE DATA NOT AVAILABLE INTERRUPT SEND= 20 ;TRANSMITTER ENABLE (GO) BIT HDPX= 10 ;HALF DUPLEX IF SET ; ; DRIVER DISPATCH TABLE ; DDT$ XW,D$$W11, .PAGE ;+ ;**- XWINI - DUP-11 SYNCHRONOUS COMMUNICATION CONTROLLER I/O INITIATOR ; ; XWINI IS ENTERED WHEN AN I/O REQUEST IS QUEUED ON THE DEVICE, ; AND AT THE END OF EACH QIO REQUEST WHICH OBEYS THE ; NORMAL RSX-11M INPUT/OUTPUT LOGIC FLOW. IF THE DEVICE IS ; AVAILABLE AND A REQUEST IS IN THE QUEUE FOR THAT UNIT, ; THE REQUEST IS INITIATED. ; IF NO REQUEST EXISTS FOR THAT UNIT OR IF IT IS ; BUSY, AN EXIT IS TAKEN TO THE CALLER. NOTE THAT BECAUSE OF ; THE NATURE OF THE DUP-11, EACH UNIT IS A CONTROLLER ITSELF, ; HAS ITS OWN SCB, AND THEREFORE ITS OWN QUEUE. ; EACH TIME XWINI IS CALLED, IT IS CALLED TO SERVICE ONLY ; THE UNIT SPECIFIED IN THE CALL. ; ; INPUTS: ; ; R4 = STATUS CONTROL BLOCK ADDRESS ; R5 = ADDRESS OF THE UCB TO BE INITIATED. ; ; OUTPUTS: ; ; IF A REQUEST IS SUCCESSFULLY DEQUEUED, THE ; DEVICE IS INITIATED APPROPRIATELY. ;- .ENABL LSB XWINI: TSTB U.CW2(R5) ;UNSOLICITED (HDPX) RECEIVE ACTIVE? BPL 10$ ;IF NOT, PROCEED JMP 180$ ;ACTIVATE NO NEW OPERATION 10$: GTPKT$ XW,D$$W11,,,T ;GET AN I/O PACKET TO PROCESS ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1 = ADDRESS OF THE I/O REQUEST PACKET. ; R2 = PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3 = CONTROLLER INDEX ; R4 = ADDRESS OF THE STATUS CONTROL BLOCK. ; R5 = ADDRESS OF THE UCB SPECIFIED IN THE ; XWINI CALL. ; ; DUP11 I/O REQUEST PACKET FORMAT ; ; WORD CONTENT ; ; 0 I/O QUEUE THREAD WORD ; 1 REQUEST PRIORITY, EVENT FLAG NUMBER ; 2 ADDRESS OF THE TCB OF THE REQUESTER TASK ; 3 POINTER TO SECOND LUN WORD IN TASK HEADER ; 4 CONTENTS OF FIRST LUN WORD (UCB) ; 5 I/O FUNCTION CODE ; 6 VIRTUAL ADDRESS OF I/O STATUS BLOCK ; 7 RELOCATION BIAS OF I/O STATUS BLOCK ; 10 I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT +140000) ; 11 VIRTUAL ADDRESS OF AST SERVICE ROUTINE ; 12 RELOCATION BIAS OF I/O BUFFER ; 13 BUFFER ADDRESS FOR TRANSFER ; 14 TOTAL BYTE COUNT TO TRANSFER ; 15 BYTE COUNT FOR SECOND PART OF TRANSMISSION OR 0 ; 16 NOT USED ; 17 NOT USED ; 20 NOT USED ; 20$: MOV S.CSR(R4),R2 ;GET RECEIVER CSR ADDRESS ADD #I.FCN+1,R1 ;POINT TO I/O FUNCTION CODE CMPB #IO.INL/256.,(R1) ;CHECK IF TRANSFER FUNCTION BLOS 70$ ;BRANCH ON CONTROL FUNCTION BIT #U2.ONL,U.CW2(R5) ;IS DEVICE ON LINE (INITIALIZED?) BEQ 90$ ;CAN'T TRANSFER IF NOT BIT #DSRDY,(R2) ;IS DATA SET READY? BEQ 90$ ;IF NOT, CAN'T TRANSFER CMPB #IO.RLB/256.,(R1) ;READ LOGICAL? BEQ 40$ ;YES, SERVICE READ REQUEST ; ; FALL THROUGH HERE ON TRANSMIT (WRITE LOGICAL) ; BIS #RTS,(R2) ;ASSERT REQUEST TO SEND MOVB U.SYNC(R5),R0 ;LOAD SYNC CHARACTER MOVB S.ITM(R4),S.CTM(R4) ;INITIALIZE TIMEOUT COUNT MOVB U.NSYN(R5),R3 ;NUMBER OF SYNCS IN LEADER 30$: MOVB R3,U.NSYC(R5) ;LOAD SYNC LEADER COUNT ADD #4,R2 ;POINT TO TRANSMIT CSR BIS #SEND,(R2)+ ;ENABLE TRANSMISSION ; ; ***** NOTE ***** ; ; SINCE TSOM IS SET THROUGHOUT THE TRANSMISSION, DATA LATE ; ERRORS WILL NEVER BE DETECTED. ; ; ***** ***** ; BIC #177400,R0 ;CLEAR HIGH BYTE BIS #TSOM,R0 ;SET TSOM MOV R0,(R2) ;SEND CHAR+TSOM TST -(R2) ;CLEAR DATA LATE ERRORS BIS #DNAEN!TXINTE,(R2) ;ENABLE INTERRUPTS BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES TRANSMISSION ; ; RECEIVE FUNCTION INITIATION ; 40$: ;REFERENCE LABEL MOV R5,R0 ;SET UP TRANSFER VECTOR ADD #U.RBUF,R0 ;RECEIVE TRANSFER INFORMATION HERE MOV U.BUF(R5),(R0)+ ;TRANSFER BIAS MOV U.BUF+2(R5),(R0)+ ;AND OFFSET MOV U.CNT(R5),(R0) ;AND COUNT BIC #SCHSYN,(R2) ;FORCE RE-SYNCHING TSTB 2(R2) ; ENSURE RECEIVE BUFFER CLEAR BIS #STRSYN!RCVENB!SCHSYN,(R2) ; ENABLE RECEIVER BR 180$ ;RETURN - INTERRUPT CODE PROPAGATES RECEIVE ; ; CONTROL FUNCTION INITIATION (INITIATE OR TERMINATE CONTROLLER, ; OR CHANGE OPERATING MODE) ; 70$: BNE 110$ ;IF NOT EQUAL, MODE CHANGE REQUEST CMP (R2)+,(R2)+ ;POINT TO TXCSR BIS #MSTRST,(R2) ;RESET DEVICE TSTB -(R1) ;START FUNCTION? BNE 100$ ;IF NON-ZERO, TERMINATE ; ; DO START FUNCTION INITIATION ; TST U.CW2(R5) ;DEVICE TO BE IN HALF DUPLEX? BPL 80$ ;NO, IF PLUS BIS #HDPX,(R2) ;PUT IN HALF DUPLEX MODE 80$: MOV #INITMD,R0 ;GET WORD SIZE, SYNC MODE BISB U.SYNC(R5),R0 ;OR IN SYNC CHARACTER MOV R0,-(R2) ;INITIALIZE DEVICE PARAMETERS BIS #STRSYN!TRMRDY!SCHSYN,-(R2) ;NOW INITIALIZE CONTROLLER BIS #U2.ONL,U.CW2(R5) ;MARK UNIT ON LINE BR 160$ ;RETURN SUCCESSFUL ; ; CAN'T ESTABLISH COMMUNICATIONS ; 90$: MOV #IE.DNR&377,R0 ;SAY CAN'T INITIALIZE DEVICE (NOT READY) BR 170$ ;DO I/O DONE ; ; FUNCTION WAS TERMINATE LINE ; 100$: BIC #^C,U.CW2(R5) ;CLEAR OPERATING STATUS BR 160$ ;RETURN SUCCESSFUL STATUS ; ; SERVICE DEVICE MODE CHANGE REQUEST ; 110$: BITB #IO.HDX,-(R1) ;SUBFUNCTION SAY HALF DUPLEX? BEQ 120$ ;IF ZERO, NO BIS #U2.HDX,U.CW2(R5) ;SAY HALF DUPLEX CHARACTERISTIC 120$: BITB #IO.FDX,(R1) ;SET MODE TO FULL DUPLEX? BEQ 150$ ;DON'T SET FULL DUPLEX BIT #U2.LIN,U.CW2(R5) ;IS LINK FULL DUPLEX? BEQ 140$ ;IF SO, RUN FULL DUPLEX 130$: MOV #IE.IFC&377,R0 ;MARK AS ILLEGAL FUNCTION BR 170$ ;AND TERMINATE 140$: BIC #U2.HDX,U.CW2(R5) ;PUT IN FULL DUPLEX IN UCB 150$: BITB #IO.SYN,(R1) ;SYNC CHARACTER SPECIFIED? BEQ 160$ ;NO, IF NOT SET MOVB I.PRM-I.FCN(R1),U.SYNC(R5) ;MARK NEW SYNC CHARACTER XWSUCC: ;REFERENCE LABEL 160$: MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUS XWFIN: ;REFERENCE LABEL 170$: CLRB S.STS(R4) ;CLEAR CONTROLLER STATUS BICB #US.BSY,U.STS(R5) ;MARK UNIT IDLE, ALSO MOV R0,-(SP) ;SAVE STATUS WORD 1 MOV S.PKT(R4),-(SP) ;SAVE OLD PACKET ADDRESS CALL XWINI ;INITIATE NEXT PACKET MOV (SP)+,R3 ;GET OLD PACKET ADDRESS MOV I.PRM+4(R3),R1 ;RETURN REQUESTED ITEM COUNT MOV (SP)+,R0 ;RESTORE STATUS WORD 1 CALLR $IOFIN ;TERMINATE OLD PACKET 180$: RETURN ; ; ; POWER FAIL SERVICE ; XWPWF: ;REFERENCE LABEL CLRB S.CTM(R4) ;DISABLE DEVICE TIMEOUTS MOV #IE.DNR&377,R0 ;PUT ERROR CODE IN R0 FOR DWTMO BR XWOUT ;FINISH I/O ABORT ; ; I/O CANCELLATION SERVICE ; ; INPUTS: ; R0=I/O PACKET ADDRESS ; R1=TCB ADDRESS OF TASK TO CANCEL ; R4=SCB ADDRESS ; R5=UCB ADDRESS XWCAN: ;;;REFERENCE LABEL CMP R1,I.TCB(R0) ;;;CANCEL FOR THIS TASK? BNE 180$ ;;;JUST RETURN IF NOT CMPB #IO.WLB/256.,I.FCN+1(R0) ;;;TRANSMIT FUNCTION? BEQ 180$ ;;;LET TRANSMIT FINISH TST U.RCNT(R5) ;;;RECEIVER FINISHED? BLE 180$ ;;;RETURN IF YES BIC #RCVENB!SCHSYN,@S.CSR(R4) ;DISABLE RECEIVER MOV #IE.ABO&377,R0 ;;;PUT ERROR CODE IN R0 FOR XWOUT BR XWOUT ;;;FINISH OFF RECEIVE PACKET ; ; TIMEOUT SERVICE ROUTINE ; ; INPUTS: ; ; R0 = DEVICE TIMEOUT STATUS 'IE.DNR' ; R3 = CONTROLLER INDEX ; R4 = ADDRESS OF SCB ; R5 = ADDRESS OF UCB ; XWOUT: ;;;REFERENCE LABEL MOV S.CSR(R4),R4 ;;;GET RECEIVER CSR BIC #TXINTE!SEND!DNAEN,4(R4) ;;;DISABLE TRANSMITTER BIC #RTS,(R4) ;;;TURN OFF CARRIER MTPS #0 ;;;ALLOW INTERRUPTS 210$: JMP XWTXND ;WAIT FOR SOFTWARE TIMEOUT .DSABL LSB ; ; **- $XWINP - DUP-11 INPUT INTERRUPT SERVICE ; $XWINP:: ;;;REFERENCE LABEL INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODE CALL XWSET ;;;SET CSR IN R4, UCB IN R5 BIC #STRSYN,(R4)+ ;;; EXIT STRIP SYNC MODE MOV (R4),R4 ;;;CONTENTS OF RCV BUFFER IN R4 MOV KISAR6,-(SP) ;;;SAVE CURRENT MAPPING MOV U.RBUF(R5),KISAR6 ;;;MAP TO USER BUFFER MOVB R4,@U.RBUF+2(R5) ;;;STORE BYTE IN USER BUFFER MOV (SP)+,KISAR6 ;;;RESTORE CURRENT MAPPING DEC U.RCNT(R5) ;;;SEE IF COUNT SATISFIED BEQ 30$ ;;;YES, IF EQUAL INC U.RBUF+2(R5) ;;;BUMP BYTE ADDRESS BIT #20000,U.RBUF+2(R5) ;;;OVERFLOWED 4K BOUNDARY? BEQ 20$ ;;;NO, IF ZERO BIC #20000,U.RBUF+2(R5) ;;;CLEAR OVERFLOW BIT ADD #200,U.RBUF(R5) ;;;BUMP BIAS 20$: RETURN ;;;EXIT FROM INTERRUPT ; ; REQUEST SATISFIED ; 30$: ;REFERENCE LABEL MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS BIC #RCVENB,@S.CSR(R4) ;;;DISABLE RECEIVER CALL $FORK ;;;GO TO FORK LEVEL JMP XWSUCC ;COMPLETE SUCCESSFUL I/O ; ; **- $XWOUT - TRANSMITTER INTERRUPT SERVICE ; $XWOUT:: ;;;REFERENCE LABEL INTSV$ XW,PR5,D$$W11 ;;;GENERATE INTERRUPT SAVE CODE CALL XWSET ;;;SET RECEIVE CSR IN R4, UCB IN R5 ADD #4,R4 ;;;POINT TO TX CSR TST (R4)+ ;;;DATA NOT AVAILABLE? BPL 10$ ;;;NO, IF NOT SET ; ; CHECK DATA LATE ; TSTB -2(R4) ;;;TRANSMITTER DONE SET? BPL 60$ ;;;IF NOT, DISMISS INTERRUPT 10$: BIT #CTS,-6(R4) ;;;CLEAR TO SEND SET? BEQ 20$ ;;;IF NOT, SEND A SYNC TSTB U.NSYC(R5) ;;;SYNC COUNT ZERO? BEQ 30$ ;;;IF YES, TRANSMIT DATA DECB U.NSYC(R5) ;;;DECREMENT SYNC LEADER COUNT BLE 30$ ;;;IF LE, TRANSMIT DATA 20$: MOVB U.SYNC(R5),(R4) ;;;SEND A SYNC CHARACTER BR 50$ ;;;EXIT ; ; SET UP AND TRANSMIT A BYTE ; 30$: DEC U.CNT(R5) ;;;CHECK COUNT (0 NOT VALID) BGE 40$ ;;;IF NOT, CONTINUE TST U.CW2(R5) ;;;IN HALF DUPLEX? BPL 80$ ;;;IF NOT, NO TURNAROUND CMP #-3,U.CNT(R5) ;;;SENT TWO MARKS? BGE 70$ ;;;IF SO, TURN LINE AROUND MOVB #-1,(R4) ;;;OUTPUT A MARK BR 50$ ;;;DISMISS INTERRUPT 40$: CALL $GTBYT ;;;GET NEXT BYTE FROM BUFFER MOVB (SP)+,(R4) ;;;OUTPUT CHARACTER 50$: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS BACK MOVB S.ITM(R4),S.CTM(R4) ;;;RESET TIMEOUT COUNT 60$: BR XWSXT ;;;EXIT FROM INTERRUPT 70$: BIC #SEND,-(R4) ;;;DON'T IDLE SYNC TST -(R4) ;;;CLEAR RECEIVE DONE AND ERROR BIC #SCHSYN!RTS,-(R4) ;;;TURN OFF CARRIER BIS #SCHSYN,(R4) ;;;FORCE RESYNCHING ADD #6,R4 ;;;POINT TO TRANSMIT BUFFER 80$: BIC #TXINTE!DNAEN!SEND,-(R4) ;;;DISABLE TRANSMITTER CALL $FORK ;;;CREATE SYSTEM PROCESS MOV #IS.SUC&377,R0 ;RETURN SUCCESSFUL STATUS XWTXND: ;REFERENCE LABEL MOV U.SCB(R5),R4 ;RESTORE SCB TO R4 JMP XWFIN ;MARK COMPLETION .PAGE ; ; XWSET - SET UP REGISTER R4 WITH CSR ADDRESS, R5 WITH ; UCB ADDRESS. UNIT NUMBER IN LOW ORDER 4 BITS OF UNIT. ; XWSET: ;;;REFERENCE LABEL TST R5 ;;;TEST FOR VALID UCB ADDRESS BEQ 10$ ;;;IF NO UCB, TROUBLE BIT #U2.ONL,U.CW2(R5) ;;;UNIT ON LINE? BEQ 10$ ;;;IF NOT ON LINE, CAN'T TRANSFER MOV U.SCB(R5),R4 ;;;FIRST GET SCB ADDRESS MOV S.CSR(R4),R4 ;;;NOW DEVICE CSR ADDRESS RETURN ;;;AND NOW RETURN 10$: TST (SP)+ ;;;CLEAR STACK OF RETURN ADDRESS XWSXT: JMP $INTXT ;;;DISMISS INTERRUPT .END